﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Linq;

namespace QldtSdh.GUI.DuLieu
{
    using BLL;
    using DAL;
    using DAL.Models;
    using QldtSdh.Utils;
    using QldtSdh.GUI.Utils;

    public partial class FormQuanLyChuongTrinhDaoTao_Import : QldtSdh.GUI.Common.BaseDialog
    {
        private ChuongTrinhDaoTao m_ChuongTrinhDaoTao;
        private List<HocPhan_Import> m_lstHocPhanToAdd;
        private List<HocPhanDaoTao_Import> m_lstHocPhanDaoTaoToAdd;
        private DAL.Models.CEMS4UG_DHKHContext m_dbContext;

        public FormQuanLyChuongTrinhDaoTao_Import(ChuongTrinhDaoTao chuongtrinhdaotao, CEMS4UG_DHKHContext db)
        {
            InitializeComponent();
            m_ChuongTrinhDaoTao = chuongtrinhdaotao;
            m_dbContext = db;
            gridHocPhanDaoTao.SetDataGridViewAsReadonly(rowHeadersVisible: true, columnHeadersVisible: true);
            gridHocPhanDaoTao.AddRowIndexing();
        }

        private void lnkSelectFile_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            var dlg = new OpenFileDialog();
            dlg.Title = "Chọn tệp Excel...";
            dlg.Filter = "Tệp Excel (*.XLS)|*.xls";
            if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                txtExcelFileName.Text = dlg.FileName;
                NapDanhSachBangTinh();
            }
        }

        private void lnkGetSheetList_Click(object sender, EventArgs e)
        {
            NapDanhSachBangTinh();
        }

        private void NapDanhSachBangTinh()
        {
            ep.Clear();
            var filename = txtExcelFileName.Text;
            if (string.IsNullOrEmpty(filename))
            {
                ep.SetIconAlignment(lblExcelFilename, ErrorIconAlignment.MiddleLeft);
                ep.SetError(lblExcelFilename, "Bạn chưa chọn tệp Excel");
                return;
            }
            try
            {
                var ei = new ExcelImporter(filename);
                var lstSheet = ei.GetSheetNameList();
                cbxSheet.Items.Clear();
                foreach (var sheet in lstSheet)
                    cbxSheet.Items.Add(sheet);
                if (lstSheet.Count > 0)
                    cbxSheet.SelectedIndex = 0;
            }
            catch (Exception exc)
            {
                ep.SetIconAlignment(lblExcelFilename, ErrorIconAlignment.MiddleLeft);
                ep.SetError(lblExcelFilename, "Không thể nạp danh sách bảng tính\r\n" + exc.Message);
            }
        }

        private bool isNumber(string st)
        {
            try
            {
                Convert.ToInt32(st);
            }
            catch
            {
                return false;
            }
            return true;
        }

        class HocPhanDaoTao_Import
        {
            public string MaHocPhan { get; set; }
            public string TenHocPhan { get; set; }
            public string SoTinChi { get; set; }
            public string HocKy { get; set; }
            public string HeSoDiemQTHT { get; set; }
            public string HinhThucHoc { get; set; }
            public string HinhThucThi { get; set; }
            public string KhoiKienThuc { get; set; }
            public bool LaHocPhanBatBuoc { get; set; }

            public bool BoSungHocPhan { get; set; }
            public ChuongTrinhDaoTao_HocPhan HocPhanDaoTao { get; set; }
            public string Error { get; set; }
            public bool DaImport { get; set; }
        }

        class HocPhan_Import
        {
            public HocPhan HocPhan { get; set; }
            public bool DaImport { get; set; }
        }

        private void btnReadSheetData_Click(object sender, EventArgs e)
        {
            #region var ei = new ExcelImporter() or return;
            ep.Clear();
            var filename = txtExcelFileName.Text;
            if (string.IsNullOrEmpty(filename))
            {
                ep.SetIconAlignment(lblExcelFilename, ErrorIconAlignment.MiddleLeft);
                ep.SetError(lblExcelFilename, "Bạn chưa chọn tệp Excel");
                return;
            }
            var ei = new ExcelImporter(filename);
            string sheetName = null;
            SheetName oSheetName = null;
            if (cbxSheet.SelectedItem != null)
                oSheetName = cbxSheet.SelectedItem as SheetName;
            if (oSheetName != null)
                sheetName = oSheetName.Name;
            if (string.IsNullOrEmpty(sheetName))
            {
                ep.SetIconAlignment(lblSheetname, ErrorIconAlignment.MiddleLeft);
                ep.SetError(lblSheetname, "Bạn chưa chọn bảng tính");
                return;
            }
            #endregion

            var oBatDau = txtOBatDau.Text;
            var oKetThuc = txtOKetThuc.Text;
            var dt = ei.ReadData(sheetName, oBatDau, oKetThuc, false);
            m_lstHocPhanToAdd = new List<HocPhan_Import>();
            m_lstHocPhanDaoTaoToAdd = new List<HocPhanDaoTao_Import>();

            var nganhDaoTao = m_dbContext.NganhDaoTaoDbSet.Where(x => x.MaNganhDaoTaoGUID == m_ChuongTrinhDaoTao.MaNganhDaoTaoGUID).FirstOrDefault();
            var maDonViPhuTrach = nganhDaoTao.MaDonViPhuTrachGUID;

            int khoiKienThuc = 1;
            bool laHocPhanBatBuoc = true;
            if (dt.Columns.Count < 8)
            {
                var nAdd = 8 - dt.Columns.Count;
                for (int i = 0; i < nAdd; i++)
                {
                    var dataColumn = new DataColumn(i.ToString(), typeof(string));
                    dataColumn.AllowDBNull = true;
                    dt.Columns.Add(dataColumn);
                }
            }
            //MessageBox.Show(dt.Columns.Count.ToString());

            foreach (DataRow drow in dt.Rows)
            {
                var stSTT = Convert.ToString(drow[0]);
                if (isNumber(stSTT))
                { }
                else if (string.IsNullOrEmpty(stSTT) == false)
                {
                    var stKhoiKienThuc = BizKhoiKienThuc.GetByAbbr(stSTT);
                    if (string.IsNullOrEmpty(stKhoiKienThuc))
                    {
                        laHocPhanBatBuoc = stSTT.ToLower().Contains("bắt buộc");
                        continue;
                    }
                    else
                    {
                        khoiKienThuc = BizKhoiKienThuc.ConvertToInt(stKhoiKienThuc);
                        //laHocPhanBatBuoc = true;
                        continue;
                    }
                }

                var x = new HocPhanDaoTao_Import();
                var stError = "";
                var stMaHocPHan = Convert.ToString(drow[1]).Trim();
                x.MaHocPhan = stMaHocPHan;
                if (string.IsNullOrEmpty(stMaHocPHan))
                    continue;
                var tenHocPhan = Convert.ToString(drow[2]).Trim();
                x.TenHocPhan = tenHocPhan;

                var stSoTinChi = Convert.ToString(drow[3]).Trim();
                x.SoTinChi = stSoTinChi;
                var soTinChi = -1;
                try { soTinChi = Convert.ToInt32(stSoTinChi); }
                catch { stError = stError.Append("Số TC không hợp lệ"); }

                var stHocKy = Convert.ToString(drow[4]).Trim();
                x.HocKy = stHocKy;
                var hocKy = -1;
                try { hocKy = Convert.ToInt32(x.HocKy); }
                catch { stError = stError.Append("Học kỳ không hợp lệ"); }

                var stHeSoDiemQTHT = Convert.ToString(drow[5]).Trim();
                if (string.IsNullOrEmpty(stHeSoDiemQTHT))
                    stHeSoDiemQTHT = "30"; // Hệ số điểm QTHT mặc định
                x.HeSoDiemQTHT = stHeSoDiemQTHT;
                var heSoDiemQTHT = -1;
                try { heSoDiemQTHT = Convert.ToInt32(stHeSoDiemQTHT); }
                catch { stError = stError.Append("Hệ số điểm QTHT không hợp lệ"); }

                var hinhThucHoc = Convert.ToString(drow[6]).Trim();
                if (string.IsNullOrEmpty(hinhThucHoc))
                    hinhThucHoc = BizHinhThucHoc.HinhThucHoc_LyThuyet;
                x.HinhThucHoc = hinhThucHoc;
                var hinhThucThi = Convert.ToString(drow[7]).Trim();
                if (string.IsNullOrEmpty(hinhThucThi))
                    hinhThucThi = BizHinhThucThi.HinhThucThi_VanDap;
                x.HinhThucThi = hinhThucThi;
                x.LaHocPhanBatBuoc = laHocPhanBatBuoc;
                x.KhoiKienThuc = BizKhoiKienThuc.ConvertToString(khoiKienThuc);

                var hocPhan = BizHocPhan.GetByMaHocPhan(stMaHocPHan, m_dbContext);
                if (hocPhan == null)
                {
                    if (string.IsNullOrEmpty(x.TenHocPhan))
                    {
                        continue; // dòng TỔNG SỐ TÍN CHỈ
                    }

                    #region Học phần chưa tồn tại -> Tạo mới học phần
                    hocPhan = new HocPhan()
                    {
                        MaHocPhanGUID = System.Guid.NewGuid().ToString(),
                        MaDonViPhuTrachGUID = maDonViPhuTrach,
                        MaHocPhan = stMaHocPHan,
                        TenHocPhan = tenHocPhan,
                        SoTinChi = soTinChi,
                        HeSoDiemQTHT = heSoDiemQTHT,
                        HinhThucThi = hinhThucThi,
                        HinhThucHoc = hinhThucHoc
                    };
                    x.BoSungHocPhan = true;
                    m_lstHocPhanToAdd.Add(new HocPhan_Import() { HocPhan = hocPhan, DaImport = false });
                    #endregion
                }

                if (string.IsNullOrEmpty(stError))
                {
                    #region Tạo mới học phần đào tạo
                    if (x.SoTinChi.Equals(hocPhan.SoTinChi.ToString()) == false)
                        stError = stError.Append("Sai số tín chỉ so với dữ liệu gốc");
                    var hpdaotao = new ChuongTrinhDaoTao_HocPhan()
                    {
                        MaChuongTrinhDaoTaoGUID = m_ChuongTrinhDaoTao.MaChuongTrinhDaoTaoGUID,
                        MaHocPhan = hocPhan.MaHocPhanGUID,
                        HocKy = hocKy,
                        LaHocPhanBatBuoc = laHocPhanBatBuoc,
                        KhoiKienThuc = khoiKienThuc
                    };
                    x.HocPhanDaoTao = hpdaotao;
                    #endregion
                }
                x.Error = stError;
                m_lstHocPhanDaoTaoToAdd.Add(x);
            }
            bsHocPhanDaoTao.DataSource = m_lstHocPhanDaoTaoToAdd;
            gridHocPhanDaoTao.SetDataSource(bsHocPhanDaoTao);
        }

        private void btnLuuDuLieu_Click(object sender, EventArgs e)
        {
            ep.Clear();
            List<HocPhanDaoTao_Import> lstHocPHanDaoTao = null;
            if (bsHocPhanDaoTao.DataSource != null)
                lstHocPHanDaoTao = bsHocPhanDaoTao.DataSource as List<HocPhanDaoTao_Import>;
            if (lstHocPHanDaoTao == null)
            {
                ep.SetError(btnLuuDuLieu, "Chưa có dữ liệu");
                return;
            }

            using (var tx = m_dbContext.Database.BeginTransaction())
            {
                foreach (var x in m_lstHocPhanToAdd)
                {
                    if (x.DaImport == false)
                        try
                        {
                            BizHocPhan.BoSung(x.HocPhan);
                            x.DaImport = true;
                        }
                        catch (Exception exc)
                        {
                            DialogUtils.ShowErrorWithDefaultTitle("Không bổ sung thông tin học phần \"{0}\" được.\r\nChi tiết lỗi: {1}",
                            x.HocPhan.TenHocPhan, exc.ToString());
                            tx.Rollback();
                            return;
                        }
                }

                foreach (var x in lstHocPHanDaoTao)
                {
                    if (!string.IsNullOrEmpty(x.Error))
                        continue;
                    if (x.DaImport)
                        continue;
                    try
                    {
                        BizChuongTrinhDaoTao_HocPhan.Add(x.HocPhanDaoTao, m_dbContext);
                        x.DaImport = true;
                    }
                    catch (Exception exc)
                    {
                        DialogUtils.ShowErrorWithDefaultTitle("Không bổ sung học phần \"{0}\" cho chương trình đào tạo được.\r\nChi tiết lỗi: {1}",
                            x.TenHocPhan, exc.ToString());
                        tx.Rollback();
                        return;
                    }
                }
                tx.Commit();
            }
        }
    }
}
